之前疫情嚴重時有居家工作一段時間,而公司的筆電是14吋,在家的話想當然就是要爽爽外接大螢幕嘛(竊笑)!於是我就跑去賣場買了一台27吋的螢幕,配合家中原本的27吋螢幕雙開,準備好好的來「開拓視野」。
當接好一台螢幕後,我突然意識到一個問題,公司筆電只有一個HDMI的接口…(哭阿),好在賣場還沒關門,馬上手刀趕去買了一個 Type-C 轉 HDMI 的轉接器,回家後將轉接器的 Type-C 一端(公)插在筆電的 Type-C 接口(母),再將螢幕的HDMI(公)插在轉接器的HDML接口(母)。耶嘿!成功了,加上筆電本身的話我就有三螢幕了,可喜可賀。
以上透過 Type-C 轉 HDMI 的轉接器,完成不同規格轉接的使命,用成設計模式的觀點來看,就稱之為『Adapter』模式!
將一個類別的介面轉換成客戶希望的另一個介面。Adapter模式使原本由於介面不相容而不能一起工作的類別可以一起工作。
(圖片來源:https://upload.wikimedia.org/wikipedia/commons/d/d7/ObjectAdapter.png)
class Program
{
static void Main(string[] args)
{
Typec typec = new Typec();
IHdmi typecToHdmiAdapter = new TypecToHdmiAdapter(typec);
typecToHdmiAdapter.HdmiConnect();
}
}
public interface IHdmi
{
void HdmiConnect();
}
public interface ITypec
{
void TypecConnect();
}
public class TypecToHdmiAdapter : IHdmi
{
private readonly ITypec _typec;
public TypecToHdmiAdapter(ITypec typec)
{
this._typec = typec;
}
public void HdmiConnect()
{
_typec.TypecConnect();
Console.WriteLine("轉接完成");
}
}
public class Typec : ITypec
{
public void TypecConnect()
{
Console.WriteLine("TypeC連接成功");
}
}
從概念上來看,這兩種模式都是在做『包裝』,似乎是有點類似,但還是有些區別:
Facade | Adapter | |
---|---|---|
是否存在既有類別 | 是 | 是 |
是否必須依某個介面設計 | 否 | 是 |
物件是否需要多型行為 | 否 | 可能 |
是否需要更簡單的介面 | 是 | 否 |
Facade模式是簡化了介面,Adapter模式是將一個已有的介面轉換成另一個介面。
在範例程式碼中,是還有再優化的空間,像是 TypecToHdmiAdapter 類別其實應該變成一個更通用的 Adapter 類別,並且能夠轉換的不只是 TypeC而已 (目前是寫死在類別中),這部份我們會在之後的 『Strategy』模式做介紹,那我們明天見囉~